﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once
#include <stdint.h>
#include <string>
#include <functional>

namespace gcmp { 
    /// \brief 文件加载错误码。
    enum class DocumentLoadError : int32_t
    {
        UnKnow = -1,                       ///<未知。
        No = 0,                            ///< 没有错误。
        NotExist = 1,                      ///< 路径不存在。
        NotFile = 2,                       ///< 不是文件。
        FileBroken = 3,                    ///< 文件（包）破损,或者不支持的文件格式。比如后缀名相同，但里面数据不是平台提供的格式。
        Model = 4,                         ///< 模型加载错误。
        Material = 5,                      ///< 材质加载错误。
        ReadonlyForSharingViolation = 6,   ///< 文件被另一个程序占用，以只读方式打开。
        ReadonlyForAccessDenied = 7,       ///< 程序对文件没有写权限，以只读方式打开。
        AlreadyOpened = 8,                 ///< 文档已经打开，重复打开已打开的文档。
        AlreadyOpenedByLinkedMode = 9,     ///< 文档已经被链接方式打开。
        ElementContainsWrongData = 10,     ///< 对象含有错误数据。比如把反序列化出来的NdbObject转成C++Element对象失败，或者Element忘记升级。
        FileContainsUnrecognizedElements = 11, ///< 含有不认识的对象。比如数据定义模块未加载。
        FailToProcessFileForResotre = 12,   ///< 处理崩溃恢复文件时发生错误，比如拷贝文件失败等
        OpenInterrupted = 13                ///<文档打开过程中，存在被中断的情况
    };

    struct DocumentLoadResult;
    using OnDocumentLoadingError = std::function<bool(const DocumentLoadResult&)>;

    /// \brief 文件加载结果
    struct DocumentLoadResult
    {
        DocumentLoadError ErrorCode = DocumentLoadError::UnKnow; ///< 错误码
        std::wstring ErrorMessage = L"未知状态,尚未发生错误";                     ///< 错误信息。ErrorCode != No时，包含错误信息。
        OnDocumentLoadingError OnError = nullptr;            ///< 遇到错误时的回调。给true表明希望继续，应对后续结果负责；给false表明停止，打开文档失败。
    };
}// namespace gcmp
